require("PineaLua.Lua.Pinea")

-- 初始化引擎，创建标题为"PineaTest"、尺寸800x600的窗口
pineaInit("PineaTest", 800, 600)

-- 事件对象与颜色定义
local event = PineaEvent()                    -- 事件对象
local bgColor = PineaColor(50, 50, 50, 255)   -- 背景色（深灰色）
local rect = PineaRect(100, 150, 60, 60)      -- 测试矩形
local rectColor = PineaColor(30, 30, 30, 255) -- 矩形颜色

-- 加载图像资源（路径与 Python 保持一致）
local bgImage = pineaLoadImage("Pinea/PineaTest/assets/images/bg.png")        -- 背景图
local playerImage = pineaLoadImage("Pinea/PineaTest/assets/images/mario.png") -- 玩家图像

-- 玩家图像区域定义（源区域：裁剪原图；目标区域：屏幕绘制位置）
local playerSrc = PineaRect(16 * 6, 16 * 2, 16, 16)         -- 源区域（裁剪马里奥图帧）
local playerDst = PineaRect(100, 200, 16 * 2.68, 16 * 2.68) -- 目标区域（放大2.68倍）

-- 加载音频资源
local bgm = pineaLoadMusic("Pinea/PineaTest/assets/sounds/bgm.mp3")        -- 背景音乐
local jumpSound = pineaLoadSound("Pinea/PineaTest/assets/sounds/jump.wav") -- 跳跃音效
pineaPlayMusic(bgm, true)                                                  -- 循环播放背景音乐

-- 时间控制变量（固定60帧/秒，单位：纳秒）
local lastTime = pineaGetTime()    -- 上一帧时间
local currentTime = 0              -- 当前时间
local accTime = 0                  -- 累计时间
local deltaTime = 1000000000 / 60 -- 每帧目标时间（≈16.67毫秒）
local deltaTimeF = 1 / 60.0        -- 每帧时间（秒，用于运动计算）

pineaShow()                        -- 显示窗口
local running = true               -- 主循环标志

-- 主循环（与 Python 逻辑完全一致）
while running do
    -- 事件处理循环：处理所有待触发事件
    while pineaPollEvent(event) do
        if event.type == PINEA_EVENT_QUIT then
            -- 窗口关闭事件：退出主循环
            running = false
        elseif event.type == PINEA_EVENT_KEY_DOWN then
            -- 按键按下：更新状态为按下
            Input.update(event.key, true)
        elseif event.type == PINEA_EVENT_KEY_UP then
            -- 按键释放：更新状态为释放
            Input.update(event.key, false)
        else
            -- 调试输出：打印其他事件信息（类型、按键、鼠标坐标）
            print(string.format("%d,%d,%.2f,%.2f", event.type, event.key, event.x, event.y))
        end
    end

    -- 时间更新：计算帧间隔并累计时间
    currentTime = pineaGetTime()
    accTime = accTime + (currentTime - lastTime)
    lastTime = currentTime

    -- 固定帧率更新：累计时间达到目标帧时间时执行逻辑
    if accTime >= deltaTime then
        -- 多帧补偿（防止帧率波动导致逻辑卡顿）
        while accTime >= deltaTime do
            accTime = accTime - deltaTime

            -- 游戏逻辑：WASD 控制玩家移动（速度=250像素/秒）
            if Input.isKeyPressed(PINEA_KEY_A) then
                playerDst.x = playerDst.x - (deltaTimeF * 250) -- 左移
            end
            if Input.isKeyPressed(PINEA_KEY_D) then
                playerDst.x = playerDst.x + (deltaTimeF * 250) -- 右移
            end
            if Input.isKeyPressed(PINEA_KEY_W) then
                playerDst.y = playerDst.y - (deltaTimeF * 250) -- 上移
            end
            if Input.isKeyPressed(PINEA_KEY_S) then
                playerDst.y = playerDst.y + (deltaTimeF * 250) -- 下移
            end

            -- 音频控制：按键触发对应功能
            if Input.isKeyDown(PINEA_KEY_SPACE) then
                pineaPlaySound(jumpSound, 0) -- 空格键：播放跳跃音效（不循环）
            end
            if Input.isKeyDown(PINEA_KEY_H) then
                pineaPlayMusic(bgm, true) -- H键：播放背景音乐（循环）
            end
            if Input.isKeyDown(PINEA_KEY_J) then
                pineaPauseMusic() -- J键：暂停音乐
            end
            if Input.isKeyDown(PINEA_KEY_K) then
                pineaResumeMusic() -- K键：恢复音乐
            end
            if Input.isKeyDown(PINEA_KEY_L) then
                pineaStopMusic() -- L键：停止音乐
            end
        end

        -- 渲染流程：清空屏幕 → 绘制内容 → 刷新显示
        pineaClear(bgColor) -- 清空屏幕为背景色

        -- -- 绘制背景图（全屏：srcRect和dstRect传nil）
        pineaDrawImage(bgImage, nil, nil, 0, 0)
        -- -- 绘制测试矩形
        pineaFillRect(rect, rectColor)
        -- -- 绘制玩家图像（旋转30度，水平+垂直翻转）
        pineaDrawImage(
            playerImage,
            playerSrc,
            playerDst,
            30,                                         -- 旋转角度（度）
            PINEA_FLIP_HORIZONTAL + PINEA_FLIP_VERTICAL -- 翻转组合（Lua用+代替|）
        )

        pineaRender() -- 刷新屏幕，显示绘制内容
    end
end

-- 资源释放：避免内存泄漏（与 Python 释放顺序一致）
pineaDropImage(bgImage)
pineaDropImage(playerImage)
pineaDropMusic(bgm)
pineaDropSound(jumpSound)
pineaQuit() -- 退出引擎，释放所有资源
